/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trunk.model;

import java.io.Serializable;

/**
 *
 * @author Bu2spencer
 */
public class Rectangle extends ElementGeo implements Serializable{
    
    /**
     * Attribut de la classe Rectangle
     */
    private Point a;
    private Point b;
    private int hauteur;
    private int largeur;
    
    /**
     * Constructeur par defaut de Rectangle
     */
    public Rectangle (){
            this.a = null;
            this.b = null;
            this.hauteur = 0;
            this.largeur = 0;
    }
    /**
     * Surcharge du constructeur de Rectangle
     * @param a - Point a du Rectangle 
     */
    public Rectangle (Point a){
        this.a = a.createClone();
        this.b = null;
    }
    /**
     * Surcharge du constructeur de Rectangle
     * @param a - Point a du Rectangle
     * @param b - Point b du rectangle
     */
    public Rectangle (Point a,Point b){
       this.a = a.createClone();
       this.b = b.createClone();
       if(a.getX()<b.getX()){
            this.a.setX(a.getX());
            this.b.setX(b.getX());
       }else{
            this.a.setX(b.getX());
            this.b.setX(a.getX());
       }
       if(a.getY()<b.getY()){
            this.a.setY(a.getY());
            this.b.setY(b.getY());
       }else{
            this.a.setY(b.getY());
            this.b.setY(a.getY());
       }
       
       this.largeur = this.b.getX() - this.a.getX();
       this.hauteur = this.b.getY() - this.a.getY();
    }
    
    /**
     * Creer un clone de Rectangle
     * @return clone de Rectangle
     */
    @Override
    public Rectangle createClone(){
        return new Rectangle(this.a,this.b);
    }
    /**
     * Creer la symétrie du Rectangle
     * @return symetrie du Rectangle
     */
    @Override
    public Rectangle createSymetrie(){
        return new Rectangle(this.a.createSymetrie(),this.b.createSymetrie());
    }
    @Override
    public boolean equals(Object obj) {
        return (this.a.equals(((Rectangle)obj).getA())
                && (this.b.equals(((Rectangle)obj).getB())));
    }
    /**
     * Get Point a du Rectangle
     *@return a 
     */
    public Point getA() {
        return a;
    }
    /**
     *Set Point a du Rectangle
     *@param a 
     */
    public void setA(Point a) {
        this.a = a;
    }
    /**
     * Get Point b du Rectangle
     *@return b 
     */
    public Point getB() {
        return b;
    }
    /**
     *Set Point b du Rectangle
     *@param b  
     */
    public void setB(Point b) {
        this.b = b;
    }
    /**
     * Get Hauteur du Rectangle
     *@return hauteur du rectangle
     */
    public int getHauteur() {
        return hauteur;
    }
    /**
     * Set Hauteur du Rectangle
     *@param hauteur 
     */
    public void setHauteur(int hauteur) {
        this.hauteur = hauteur;
    }
    /**
     * Get largeur du Rectangle
     *@return largeur du rectangle 
     */
    public int getLargeur() {
        return largeur;
    }
    /**
     * Set largeur du Rectangle
     *@param largeur 
     */
    public void setLargeur(int largeur) {
        this.largeur = largeur;
    }
    /**
     *Override de toString
     *@return les valeurs du point a et b ainsi que le hauteur et la largeur
     */
    @Override
        public String toString() {
        return "Rectangle{ Point a=" + this.a + ", Point b=" + this.b+", Hauteur="+this.hauteur+", Largeur="+this.largeur+"}";
    }
    /**
     * isPointOver vérifie si un point est contenu dans la forme géométrique
     *@param click - point
     *@param marge - marge d'erreur
     */
    @Override
    public boolean isPointOver(Point click, int marge) {
       return (click.getX()<=this.b.getX()+marge && click.getX()>this.a.getX()-marge)&&
               (click.getY()<=this.b.getY()+marge && click.getY()>this.a.getY()-marge);
    }
    /**
     * translateTo déplace la forme géométrique
     *@param diffX - déplacement en X
     *@param diffY - déplacement en Y
     */
    @Override
    public void translateTo(int diffX, int diffY) {
        
        this.a.setX(this.a.getX()+diffX);
        this.a.setY(this.a.getY()+diffY);      
        this.b.setX(this.b.getX()+diffX);
        this.b.setY(this.b.getY()+diffY);
        
    }
    /**
     *Creer la symétrie par rapport a o
     *@param o - origine
     */
    @Override
    public void symetrieO(Point o){
        this.a.setX( o.getX() -(this.a.getX()-o.getX()));
        this.a.setY( o.getY() -(this.a.getY()-o.getY()));
        this.b.setX( o.getX() -(this.b.getX()-o.getX()));
        this.b.setY( o.getY() -(this.b.getY()-o.getY()));
    }
    /**
     *Creer la symétrie par rapport a X
     *@param o - origine
     */
    @Override
    public void symetrieX(Point o){
        this.a.setY( o.getY() -(this.a.getY()-o.getY()));
        this.b.setY( o.getY() -(this.b.getY()-o.getY()));
    }
    /**
     *Creer la symétrie par rapport a Y
     *@param o - origine
     */
    @Override
    public void symetrieY(Point o){
        this.a.setX( o.getX() -(this.a.getX()-o.getX()));
        this.b.setX( o.getX() -(this.b.getX()-o.getX()));
    }  
}
